home *** CD-ROM | disk | FTP | other *** search
/ 17 Bit Software 6: Level 6 / 17 Bit - Level 6 (1998)(Epic Marketing)[!].iso / quartz / q1073.dms / q1073.adf / IFF2ICON.LHA / IFF2Icon / IFF2Icon.asm < prev    next >
Assembly Source File  |  1993-09-02  |  20KB  |  870 lines

  1. DEBUGBOOL    =    0    (set to TRUE, if ya wanna DebugMode!)
  2.  
  3. ;;    *****************************************************************
  4.     *    Programm:    IFF2Icon                *
  5.     *            (erzeugt Icon- aus IFF-File)        *
  6.     *    Copyright:    Freeware © von Hanns Holger Rutz/Tro-    *
  7.     *            picDesign                *
  8.     *    History:    19.-30.04.1993    diese erste Version    *
  9.     *            07.08.1993    removed a little bug    *
  10.     *            31.08.1993    removed BODY-Read Bug    *
  11.     *    Bugs:        PutDiskObject() keeps sum KiloBytes of    *
  12.     *            memory, I don't know why...        *
  13.     *            IFF-Loader: DEST-Chunk,Mask?        *
  14.     *****************************************************************
  15.  
  16. ;;-- Includes --
  17.  
  18.         incdir    'sys:asm/inc/'
  19.         include    'dos/dosextens.i'
  20.         include    'exec/memory.i'
  21.         include    'intuition/intuition.i'
  22.         include    'private/dos_lib.i'
  23.         include    'private/icon_lib.i'
  24.         include    'private/macros.i'
  25.         include    'workbench/workbench.i'
  26.  
  27. ;;-- Macros --
  28.  
  29. version        macro
  30.         dc.b    '1.0b'
  31.         endm
  32.  
  33. ;;-- Konstanten --
  34.  
  35.         rsreset            ;nowhere defined in da includes...
  36. bmhd_W        rs.w    1        Bildbreite
  37. bmhd_H        rs.w    1        Bildhöhe
  38. bmhd_X        rs.w    1
  39. bmhd_Y        rs.w    1
  40. bmhd_Depth    rs.b    1        Tiefe
  41. bmhd_Mask    rs.b    1
  42. bmhd_Pack    rs.b    1        1 if ByteRunOne, 0 if none
  43. bmhd_PAD    rs.b    1
  44. bmhd_TColor    rs.w    1
  45. bmhd_XAspect    rs.b    1
  46. bmhd_YAspect    rs.b    1
  47. bmhd_PicW    rs.w    1
  48. bmhd_PicH    rs.w    1
  49. bmhd_SIZEOF    rs.b    0
  50.  
  51.         rsreset
  52. gl_DOSBase    rs.l    1
  53. gl_IconBase    rs.l    1
  54. gl_RDArgs    rs.l    1
  55. gl_Return    rs.b    1
  56.         rsword
  57. gl_Result2    rs.l    1
  58. gl_Process    rs.l    1
  59.  
  60. gl_Array     rs.b    0    \
  61. gl_aFrom    rs.l    1     \
  62. gl_aTo        rs.l    1      \
  63. gl_aDisk    rs.l    1       \
  64. gl_aDrawer    rs.l    1        \
  65. gl_aTool    rs.l    1         \
  66. gl_aProject    rs.l    1         /
  67. gl_aGarbage    rs.l    1        /
  68. gl_aComplement    rs.l    1       /
  69. gl_aBackFill    rs.l    1      /
  70. gl_aImage    rs.l    1     /
  71. gl_aPAD        rs.l    2    /
  72.  
  73. gl_RealName    rs.b    512+4        Name des IconFiles ohne evtl. '.info'
  74. gl_DiskObject    rs.l    1        Icon-Struktur, die geschrieben wird
  75.         rs.l    1        gl_FileInfo mußt be LONG-aligned :-(
  76. gl_FileInfo    rs.b    fib_SIZEOF    intern (für _GetType)
  77. gl_IconType    rs.b    1        WBDISK, WBTOOL etc.
  78.         rsword
  79. gl_VecList     rs.b    0
  80. gl_BMHD        rs.l    1    \    *AllocVec-Speicher für BMHD-Chunk
  81. gl_BODY        rs.l    1     \    *AllocVec-Speicher für BODY-Chunk
  82. gl_Image1    rs.l    1     /    *AllocVec-ImageStruktur         <-\
  83. gl_Image2    rs.l    1    /    *ImageStruktur (selected) AllocVec /
  84. VecNum        =    3
  85.  
  86. gl_SIZEOF    rs.b    0
  87.  
  88. ;;-- StartUp --
  89.  
  90. _Start        move.w    #gl_SIZEOF/2-1,d0
  91. .ClearLoop    clr.w    -(sp)
  92.         dbf    d0,.ClearLoop
  93.         movea.l    sp,gl
  94.         exec    a0
  95.         movea.l    ThisTask(a0),gl_Process(gl)
  96.         move.b    #RETURN_FAIL,gl_Return(gl)
  97.  
  98.         bsr.b    _OpenLibs
  99.         beq.b    _CleanUp
  100.         if DEBUGBOOL
  101.             *move.b    #WBTOOL,gl_IconType(gl)
  102.             moveq.l    #-1,d0
  103.             move.l    d0,gl_aImage(gl)
  104.             lea.l    .From(pc),a0
  105.             move.l    a0,gl_aFrom(gl)
  106.             lea.l    .To(pc),a0
  107.             move.l    a0,gl_aTo(gl)
  108.             lea.l    gl_RealName(gl),a1
  109. .Loop            move.b    (a0)+,(a1)+
  110.             bne.b    .Loop
  111.             bra.b    _Main
  112. .From            dc.b    'sys:Graphik/IFF/AADMagIcon.Hi4',0
  113. .To            dc.b    'ram:t',0
  114.             even
  115.         else
  116.             bsr.w    _GetArgs
  117.             beq.b    _CleanUp
  118.         endc
  119.  
  120. ;;-- Hauptprogramm --
  121.  
  122. _Main        bsr.w    _GetIcon
  123.         beq.b    .PrintError
  124.         bsr.w    _PutIcon
  125.         beq.b    .PrintError
  126.         clr.b    gl_Return(gl)
  127.         bra.b    .MainEnd
  128.  
  129. .PrintError    slib    DOS
  130.         move.l    gl_Result2(gl),d1
  131.         moveq.l    #0,d2
  132.         fjsr    PrintFault        DOS-Fehlerbeschreibung ausgeben
  133. .MainEnd
  134.  
  135. ;;-- Aufräumen --
  136.  
  137. _CleanUp    bsr.w    _Free        DiskObject-Struktur etc. freigeben
  138.         bsr.w    _FreeArgs
  139.         bsr.w    _CloseLibs
  140.         moveq.l    #0,d0
  141.         move.b    gl_Return(gl),d0
  142.         beq.b    .Exit
  143.         movea.l    gl_Process(gl),a0
  144.         move.l    gl_Result2(gl),pr_Result2(a0)
  145. .Exit        lea.l    gl_SIZEOF(sp),sp
  146.         rts
  147.  
  148. ;;-- globaler Konstantenspeicher --
  149.  
  150.         dc.b    '$VER: IFF2Icon',$A0
  151.         version
  152.         dc.b    0
  153.         even
  154.  
  155. ;;-- Libraries öffnen --
  156. ;    Out:    cc=eq, wenn Fehler
  157.  
  158. _OpenLibs    push    d0/d1/a0/a1
  159.  
  160.         exec
  161.         lea.l    .DOSName(pc),a1
  162.         moveq.l    #36,d0
  163.         fjsr    OpenLibrary
  164.         move.l    d0,gl_DOSBase(gl)
  165.         beq.b    .DOSError
  166.         lea.l    .IconName(pc),a1
  167.         moveq.l    #36,d0
  168.         fjsr    OpenLibrary
  169.         move.l    d0,gl_IconBase(gl)
  170.         beq.b    .IconError
  171.  
  172. .Exit        pull    d0/d1/a0/a1
  173.         rts
  174.  
  175. .DOSError
  176. .Error        moveq.l    #ERROR_INVALID_RESIDENT_LIBRARY,d0
  177.         move.l    d0,gl_Result2(gl)
  178.         clr.b    d0                cc=eq
  179.         bra.b    .Exit
  180.  
  181. .IconError    slib    DOS
  182.         lea.l    .ErrorTxt(pc),a0
  183.         move.l    a0,d1
  184.         lea.l    .IconName(pc),a0
  185.         move.l    a0,-(sp)
  186.         move.l    sp,d2            'icon.library' = Argument
  187.         fjsr    VPrintf
  188.         addq.l    #4,sp
  189.         bra.b    .Error
  190.  
  191. .DOSName    DOSNAME
  192. .IconName    ICONNAME
  193. .ErrorTxt    dc.b    "%s v36+ couldn't be opened!",$0a,0
  194.         even
  195.  
  196. ;;-- Libraries schließen --
  197.  
  198. _CloseLibs    push    d0/d1/a0/a1
  199.  
  200.         exec
  201.         movea.l    gl_IconBase(gl),a1        Basis oder NULL
  202.         fjsr    CloseLibrary
  203.         movea.l    gl_DOSBase(gl),a1        Basis oder NULL
  204.         fjsr    CloseLibrary
  205.  
  206.         pull    d0/d1/a0/a1
  207.         rts
  208.  
  209. ;;-- Shell-Argumente lesen/auswerten --
  210. ;    Out:    cc=eq, wenn Fehler
  211.  
  212. _GetArgs    push    d0/d1/a0-a2/lb
  213.  
  214.         slib    DOS
  215.         lea.l    .Template(pc),a0
  216.         move.l    a0,d1
  217.         lea.l    gl_Array(gl),a0
  218.         move.l    a0,d2
  219.         moveq.l    #0,d3
  220.         fjsr    ReadArgs            Argmente einlesen
  221.         move.l    d0,gl_RDArgs(gl)
  222.         beq.b    .Error
  223.  
  224.         lea.l    gl_aGarbage+4(gl),a0
  225.         moveq.l    #WBGARBAGE,d0
  226. .TypeLoop    tst.l    -(a0)
  227.         bne.b    .TypeEnd
  228.         subq.b    #1,d0                IconType berechnen
  229.         bgt.b    .TypeLoop
  230.         tst.l    gl_aTo(gl)
  231.         beq.b    .TypeError       ..weder IconFile noch Typ angegeben
  232. .TypeEnd    move.b    d0,gl_IconType(gl)
  233.  
  234.         move.l    gl_aTo(gl),d0
  235.         beq.b    .OkExit
  236.         movea.l    d0,a0
  237.         lea.l    gl_RealName(gl),a1
  238.         move.l    a1,-(sp)
  239. .NameLoop    move.b    (a0)+,(a1)+        IconNamen kopieren
  240.         bne.b    .NameLoop
  241.         subq.l    #6,a1
  242.         cmpa.l    (sp)+,a1
  243.         blt.b    .NameEnd        ..weniger als 5 Buchstaben
  244.         movea.l    a1,a0            a0 = *Eventuelles.InfoSuffix
  245.         cmpi.b    #'.',(a1)+
  246.         bne.b    .NameEnd        ..kein '.' für '.info'
  247.         move.l    #'ofni',d0
  248. .NameLoop2    move.b    (a1)+,d1
  249.         bset.l    #5,d1            LowerCase
  250.         cmp.b    d1,d0
  251.         bne.b    .NameEnd        ..kein .info-Suffix
  252.         lsr.l    #8,d0
  253.         bne.b    .NameLoop2
  254.         clr.b    (a0)            .info-Suffix entfernen
  255. .NameEnd
  256. .OkExit        moveq.l    #-1,d0            cc=ne
  257.  
  258. .Exit        pull    d0/d1/a0-a2/lb
  259.         rts
  260.  
  261. ;In: lb = *DOSBase
  262.  
  263. .Error        bsr.w    _GetIOErr
  264. .PrintUsage    lea.l    -108(sp),sp
  265.         move.l    sp,d1
  266.         moveq.l    #108,d2
  267.         fjsr    GetProgramName        Programm-Namen holen und
  268.         lea.l    .Usage(pc),a0
  269.         move.l    a0,d1
  270.         move.l    sp,d2
  271.         fjsr    VPrintf            ..zusammen mit Usage ausgeben
  272.         lea.l    108(sp),sp
  273.         clr.b    d0            cc=eq
  274.         bra.b    .Exit
  275.  
  276. .TypeError    moveq.l    #ERROR_REQUIRED_ARG_MISSING,d0
  277.         move.l    d0,gl_Result2(gl)
  278.         bra.b    .PrintUsage
  279.  
  280. .Template    dc.b    'FROM,TO/K,DISK/S,DRAWER/S,TOOL/S,PROJECT/S,GARBAGE/S,'
  281.         dc.b    'COMPLEMENT/S,BACKFILL/S,IMAGE/S',0
  282. .Usage        dc.b    'Usage:  IFF2Icon [<IFFFile>] [To <IconFile>] [<IconTy'
  283.         dc.b    'pe>] [<HighlightType>]',$0a,$0a
  284.         dc.b    '  IconType:       Disk|Drawer|Tool|Project|Garbage'
  285.         dc.b    $0a
  286.         dc.b    '  HightlightType: Complement|BackFill|Image',$0a,$0a
  287.         dc.b    '  Specify <IconFile> and/or <IconType>!',$0a,0
  288.         even
  289.  
  290. ;;-- RDArgs zurückgeben --
  291.  
  292. _FreeArgs    push    d0/d1/a0/a1/lb
  293.  
  294.         slib    DOS
  295.         move.l    gl_RDArgs(gl),d1
  296.         beq.b    .Exit
  297.         fjsr    FreeArgs
  298.  
  299. .Exit        pull    d0/d1/a0/a1/lb
  300.         rts
  301.  
  302. ;;-- IOError sichern --
  303. ;    Out:    d0.l = IOError, cc=d0.l
  304.  
  305. _GetIOErr    lpush    a0
  306.  
  307.         movea.l    gl_Process(gl),a0
  308.         move.l    pr_Result2(a0),d0        IOError in d0
  309.         move.l    d0,gl_Result2(gl)        ..und sichern (cc)
  310.  
  311.         lpull    a0
  312.         rts
  313.  
  314. ;;-- IFFFile / DefaultIcon lesen --
  315. ;    Out:    cc=eq, wenn Fehler
  316.  
  317. _GetIcon    push    d0-d2/a0/a1/lb
  318.  
  319.         slib    Icon
  320.         tst.l    gl_aTo(gl)
  321.         beq.b    .TypeEnd
  322.         bsr.w    _GetType        Typ anhand des Files ermitteln
  323.         bne.b    .TypeCont        ..kein Fehler
  324.         move.b    gl_IconType(gl),d1    ..Fehler, wichtig?
  325.         beq.w    .TypeErr        ..ja
  326.         cmpi.b    #WBTOOL,d1
  327.         beq.b    .TypeCont        ..nein
  328.         cmpi.b    #WBPROJECT,d1
  329.         bne.w    .TypeErr        ..ja
  330. .TypeCont    tst.b    gl_IconType(gl)
  331.         bne.b    .TypeEnd
  332.         move.b    d0,gl_IconType(gl)
  333. .TypeEnd
  334.         tst.l    gl_aFrom(gl)
  335.         beq.w    .GetDefault        ..DefaultIcon laden (kein From)
  336.  
  337. .Get        bsr.w    _GetIFF            IFF-Graphik einlesen
  338.         beq.w    .Exit            ..Fehler
  339.         suba.l    a0,a0
  340.         fjsr    GetDiskObject        leere DiskObjectStruktur
  341.         move.l    d0,gl_DiskObject(gl)    ..besorgen
  342.         beq.w    .GetErr
  343.         movea.l    d0,a0
  344.         move.l    #WB_DISKMAGIC<<16!WB_DISKVERSION,(a0)    ..und füllen
  345.         move.b    gl_IconType(gl),do_Type(a0)
  346.         move.l    #NO_ICON_POSITION,d0
  347.         move.l    d0,do_CurrentX(a0)
  348.         move.l    d0,do_CurrentY(a0)
  349.         cmpi.b    #WBTOOL,gl_IconType(gl)
  350.         beq.b    .GetCont3            ..kein Window
  351.         cmpi.b    #WBPROJECT,gl_IconType(gl)
  352.         beq.b    .GetCont3            ..kein Window
  353.         lea.l    .DrawerData(pc),a1
  354.         move.l    a1,do_DrawerData(a0)        Windowdaten einfügen
  355. .GetCont3
  356.         move.l    #4096,do_StackSize(a0)
  357.         movea.l    gl_Image1(gl),a1
  358.         move.l    ig_Width(a1),do_Gadget+gg_Width(a0)
  359.         move.b    #WB_DISKREVISION,do_Gadget+gg_UserData+3(a0)
  360.         move.l    a1,do_Gadget+gg_GadgetRender(a0)
  361.         moveq.l    #GADGIMAGE!GADGHCOMP,d0        Highlight: Complement
  362.         tst.l    gl_aBackFill(gl)
  363.         beq.b    .GetCont
  364.         moveq.l    #GADGIMAGE!GADGHBOX,d0        Highlight: BackFill
  365. .GetCont    tst.l    gl_aImage(gl)
  366.         beq.b    .GetCont2
  367.         moveq.l    #GADGIMAGE!GADGHIMAGE,d0    Highlight: Image
  368.         move.l    gl_Image2(gl),do_Gadget+gg_SelectRender(A0)
  369. .GetCont2    move.w    d0,do_Gadget+gg_Flags(a0)
  370.         *moveq.l #-1,d0
  371.         bra.b    .Exit
  372.  
  373. .GetDefault    moveq.l    #0,d0
  374.         move.b    gl_IconType(gl),d0
  375.         fjsr    GetDefDiskObject        DefaultIcon holen
  376.         move.l    d0,gl_DiskObject(gl)
  377.         beq.b    .GetDefErr            ..Fehler
  378.  
  379. .Exit        pull    d0-d2/a0/a1/lb
  380.         rts
  381.  
  382. .GetErr        bsr.w    _GetIOErr
  383.         lea.l    .GetErrTxt(pc),a0
  384.         bra.b    .PrintError
  385.  
  386. .GetDefErr    bsr.w    _GetIOErr
  387.         lea.l    .DefErrTxt(pc),a0
  388.         ;||
  389. ;    In:    a0 = *Text
  390.  
  391. .PrintError    move.l    a0,d1
  392.         slib    DOS
  393.         fjsr    PutStr                Fehler ausgeben
  394.         bra.b    .ErrorExit
  395.  
  396. .TypeErr    lea.l    .TypeErrTxt(pc),a0
  397.         move.l    a0,d1
  398.         lea.l    gl_RealName(gl),a0        From-Namen zusammen mit
  399.         move.l    a0,-(sp)
  400.         move.l    sp,d2
  401.         slib    DOS
  402.         fjsr    VPrintf                ..Fehlertext ausgeben
  403.         addq.l    #4,sp
  404. .ErrorExit    clr.b    d0                cc=eq
  405.         bra.b    .Exit
  406.  
  407. .DrawerData    dc.w    50,50,400,100
  408.         dc.b    -1,-1
  409.         dc.l    0
  410. .f1        =    WFLG_SIZEGADGET!WFLG_DRAGBAR!WFLG_DEPTHGADGET
  411. .f2        =    WFLG_CLOSEGADGET!WFLG_SIZEBRIGHT!WFLG_SIZEBBOTTOM
  412. .f3        =    WFLG_SIMPLE_REFRESH!WFLG_REPORTMOUSE!WFLG_WBENCHWINDOW
  413.         dc.l    .f1!.f2!.f3
  414.         dc.l    0,0,0,0,0
  415.         dc.w    90,40,-1,-1,WBENCHSCREEN
  416.         dc.l    0,0
  417.         dc.l    0
  418.         dc.w    0
  419.  
  420. .TypeErrTxt    dc.b    "Couldn't get information on '%s'!",$0a,0
  421. .DefErrTxt    dc.b    "Couldn't get the default Icon!",$0a,0
  422. .GetErrTxt    dc.b    "Unable to create Icon!",$0a,0
  423.         even
  424.  
  425. ;;-- (Default-)Icon schreiben --
  426. ;    Out:    cc=eq, wenn Fehler
  427.  
  428. _PutIcon    push    d0/d1/a0/a1/lb
  429.  
  430.         slib    Icon
  431.         tst.l    gl_aTo(gl)
  432.         beq.b    .PutDefault        ..DefaultIcon erzeugen
  433.  
  434. .Put        lea.l    gl_RealName(gl),a0
  435.         movea.l    gl_DiskObject(gl),a1
  436.         fjsr    PutDiskObject        Icon erzeugen
  437.         tst.l    d0
  438.         beq.b    .PutErr            ..Fehler
  439.         bra.b    .Exit
  440.  
  441. .PutDefault    movea.l    gl_DiskObject(gl),a0
  442.         fjsr    PutDefDiskObject    DefaultIcon erzeugen
  443.         tst.l    d0
  444.         beq.b    .PutDefErr        ..Fehler
  445.  
  446. .Exit        pull    d0/d1/a0/a1/lb
  447.         rts
  448.  
  449. .PutDefErr    bsr.w    _GetIOErr
  450.         lea.l    .DefErrTxt(pc),a0
  451.         move.l    a0,d1
  452.         slib    DOS
  453.         fjsr    PutStr                Fehlertext ausgeben
  454.         clr.b    d0                cc=eq
  455.         bra.b    .Exit
  456.  
  457. .PutErr        bsr.w    _GetIOErr
  458.         lea.l    gl_RealName(gl),a0        To-Namen zusammen mit
  459.         move.l    a0,-(sp)
  460.         lea.l    .ErrTxt(pc),a0
  461.         move.l    a0,d1
  462.         move.l    sp,d2
  463.         slib    DOS
  464.         fjsr    VPrintf                ..Fehlertext ausgeben
  465.         addq.l    #4,sp
  466.         clr.b    d0                cc=eq
  467.         bra.b    .Exit
  468.  
  469. .DefErrTxt    dc.b    "Couldn't create default Icon!",$0a,0
  470. .ErrTxt        dc.b    "Couldn't create Icon for '%s'!",$0a,0
  471.         even
  472.  
  473. ;;-- DiskObject-Struktur etc. freigeben --
  474.  
  475. _Free        push    d0-d2/a0-a2/lb
  476.  
  477.         movea.l    gl_DiskObject(gl),d0
  478.         beq.b    .ObjectEnd
  479.         slib    Icon
  480.         movea.l    d0,a0
  481.         fjsr    FreeDiskObject        DiskObject freigeben,
  482.                         ;bei nicht-default werden die
  483.                         ;Images nicht freigeben
  484. .ObjectEnd
  485.         lea.l    gl_VecList(gl),a2
  486.         moveq.l    #VecNum-1,d2
  487.         exec
  488. .VecLoop    movea.l    (a2)+,a1
  489.         fjsr    FreeVec        BMHD, BODY, Images etc. freigeben
  490.         dbf    d2,.VecLoop
  491.  
  492.         pull    d0-d2/a0-a2/lb
  493.         rts
  494.  
  495. ;;-- Filetypen ermitteln und gl_RealName ggf. ändern --
  496. ;    Out:    d0.b = IconType, cc=eq, wenn Fehler
  497.  
  498. _GetType    push    d0-d4/a0-a3/lb
  499.  
  500.         lea.l    gl_RealName(gl),a3
  501.         move.l    a3,a0
  502. .Icon        slib    Icon
  503.         fjsr    GetDiskObject        Icon besorgen
  504.         tst.l    d0
  505.         beq.b    .File            ..keins gefunden
  506.         movea.l    d0,a0
  507.         move.b    do_Type(a0),3(sp)    Typ des alten Icons übernehmen
  508.         fjsr    FreeDiskObject
  509.         bra.w    .OkExit
  510.  
  511. .File        slib    DOS
  512.         move.l    a3,d1            *Name
  513.         moveq.l    #ACCESS_READ,d2
  514.         fjsr    Lock
  515.         move.l    d0,d4
  516.         beq.w    .Error            ..konnte nicht gelockt werden
  517.         move.l    d4,d1
  518.         lea.l    gl_FileInfo(gl),a2
  519.         move.l    a2,d2
  520.         andi.b    #~3,d2            LONG-align
  521.         movea.l    d2,a2            Fuck the DOS-Library!!!
  522.         fjsr    Examine
  523.         tst.w    d0
  524.         beq.w    .ErrorUnLock        ..konnte nicht examint werden
  525.         tst.l    fib_DirEntryType(a2)
  526.         blt.b    .CheckFile        ..eine Datei => die überprüfen
  527.  
  528. .Dir        move.l    d4,d1
  529.         lea.l    -512(sp),sp
  530.         move.l    sp,d2
  531.         move.l    #512,d3
  532.         fjsr    NameFromLock    vollen Namen ermitteln (ohne assigns)
  533.         movea.l    sp,a2
  534.         lea.l    512(sp),sp
  535.         tst.l    d0
  536.         beq.b    .ErrorUnLock        ..Fehler
  537.         move.l    d4,d1
  538.         fjsr    UnLock
  539. .DirLoop    move.b    (a2)+,(a3)+        Namen kopieren
  540.         bne.b    .DirLoop
  541.         moveq.l    #WBDRAWER,d0
  542.         move.l    d0,(sp)
  543.         subq.l    #2,a3
  544.         cmpi.b    #':',(a3)+
  545.         bne.b    .OkExit            ..Verzeichnis oder SoftLink
  546.  
  547. .Disk        moveq.l    #WBDISK,d0    
  548.         move.l    d0,(sp)            ..Boot-/Root-Directory (Disk)
  549.         move.l    #'ksid',d0
  550. .DiskLoop    move.b    d0,(a3)+        'disk' ranhängen
  551.         lsr.l    #8,d0
  552.         bne.b    .DiskLoop
  553.         clr.b    (a3)            String abschließen
  554.         bra.b    .OkExit
  555.  
  556. .CheckFile    move.l    d4,d1
  557.         fjsr    OpenFromLock        Datei öffnen
  558.         tst.l    d0
  559.         beq.b    .ErrorUnLock        ..Fehler
  560.         move.l    d0,d4
  561.         move.l    d4,d1
  562.         clr.l    -(sp)
  563.         move.l    sp,d2
  564.         moveq.l    #4,d3
  565.         fjsr    Read            4 Bytes zum Prüfen lesen
  566.         move.l    (sp)+,d2
  567.         cmp.l    d3,d0
  568.         blt.b    .ErrorClose        ..Fehler
  569.         move.l    d4,d1
  570.         fjsr    Close            Datei wieder schließen
  571.         tst.w    d0
  572.         beq.b    .Error            ..Fehler
  573.         moveq.l    #WBTOOL,d0
  574.         move.l    d0,(sp)
  575.         cmpi.l    #$03F3,d2        ist die Datei ausführbar?
  576.         beq.b    .OkExit            ..ja (Tool)
  577.         moveq.l    #WBPROJECT,d0
  578.         move.l    d0,(sp)            ..nein (Project)
  579.  
  580. .OkExit        moveq.l    #-1,d0
  581. .Exit        pull    d0-d4/a0-a3/lb
  582.         rts
  583.  
  584. ;die .Error-Routinene benötigen lb = *DOSBase!
  585.  
  586. .ErrorClose    bsr.w    _GetIOErr
  587.         move.l    d4,d1
  588.         fjsr    Close
  589.         bra.b    .ErrorExit
  590.  
  591. .ErrorUnLock    bsr.w    _GetIOErr
  592.         move.l    d4,d1
  593.         fjsr    UnLock
  594.         bra.b    .ErrorExit
  595.  
  596. .Error        bsr.w    _GetIOErr
  597. .ErrorExit    clr.b    d0            cc=eq
  598.         bra.b    .Exit
  599.  
  600. ;;-- IFF-Graphik laden --
  601. ;    Out:    cc=eq, wenn Fehler
  602.  
  603. _GetIFF        push    d0-d6/a0-a2/lb
  604.  
  605.         lea.l    -12(sp),sp
  606.         moveq.l    #%11,d6            ;Bit0 cleared = BMHD read
  607.                         ;Bit1 cleared = BODY read
  608.         slib    DOS
  609.         move.l    gl_aFrom(gl),d1
  610.         move.l    #MODE_OLDFILE,d2
  611.         fjsr    Open            IFF-Datei öffnen
  612.         move.l    d0,d4
  613.         beq.w    .OpenErr        ..Fehler
  614.         move.l    d4,d1
  615.         move.l    sp,d2
  616.         moveq.l    #12,d3
  617.         fjsr    Read            Header lesen
  618.         cmp.l    d3,d0
  619.         blt.w    .ILBMErr        ..Fehler
  620.         cmpi.l    #'FORM',(sp)
  621.         bne.w    .ILBMErr2        ..kein "FORM"
  622.         cmpi.l    #'ILBM',8(sp)
  623.         bne.w    .ILBMErr2        ..kein "ILBM"
  624.         move.l    4(sp),d5        Länge des Files -8
  625.         addq.l    #4,d5            ..für eigene Ansprüche ändern
  626.  
  627. .ChunkLoop    tst.l    d6            nötige Chunx gelesen?
  628.         beq.w    .FileOk            ..ja
  629.         subq.l    #8,d5
  630.         ble.w    .MissErr        ..nein, aber Ende der Datei
  631.         move.l    d4,d1
  632.         move.l    sp,d2
  633.         moveq.l    #8,d3
  634.         fjsr    Read            Chunkheader lesen
  635.         cmp.l    d3,d0
  636.         blt.w    .ReadErr        ..Fehler
  637.         sub.l    4(sp),d5
  638.         btst.l    #0,d6            BMHD-Chunk schon gelesen?
  639.         beq.b    .ChunkCont        ..ja
  640.         cmpi.l    #'BMHD',(sp)
  641.         beq.b    .BMHD            ..nein, dies ist einer
  642. .ChunkCont
  643.         btst.l    #1,d6            BODY-Chunk schon gelesen?
  644.         beq.b    .ChunkCont2        ..ja
  645.         cmpi.l    #'BODY',(sp)
  646.         beq.b    .BODY            ..nein, dies ist einer
  647. .ChunkCont2
  648.         move.l    d4,d1
  649.         move.l    4(sp),d2
  650.         moveq.l    #OFFSET_CURRENT,d3
  651.         fjsr    Seek            zum nächsten Chunk
  652.         bsr.w    _GetIOErr
  653.         beq.b    .ChunkLoop
  654.         bra.w    .ReadErr        ..Fehler
  655.  
  656. .BMHD        exec
  657.         move.l    4(sp),d3
  658.         move.l    d3,d0
  659.         moveq.l    #MEMF_PUBLIC,d1
  660.         fjsr    AllocVec        Speicher besorgen
  661.         move.l    d0,gl_BMHD(gl)
  662.         slib    DOS
  663.         beq.w    .MemErr            ..Fehler
  664.         move.l    d0,d2
  665.         move.l    d4,d1
  666.         fjsr    Read            Daten einlesen
  667.         bclr.l    #0,d6
  668.         cmp.l    d3,d0
  669.         beq.b    .ChunkLoop
  670.         bra.w    .ReadErr        ..Fehler
  671.  
  672. .BODY        exec
  673.         move.l    4(sp),d3
  674.     addq.l    #1,d3
  675.     bclr.l    #0,d3
  676.         move.l    d3,d0
  677.         moveq.l    #MEMF_PUBLIC,d1
  678.         fjsr    AllocVec        Speicher besorgen
  679.         move.l    d0,gl_BODY(gl)
  680.         slib    DOS
  681.         beq.w    .MemErr            ..Fehler
  682.         move.l    d0,d2
  683.         move.l    d4,d1
  684.         fjsr    Read            Daten einlesen
  685.         bclr.l    #1,d6
  686.         cmp.l    d3,d0
  687.         beq.w    .ChunkLoop
  688.         bra.w    .ReadErr        ..Fehler
  689.  
  690. .FileOk        move.l    d4,d1
  691.         fjsr    Close            Fertig, Datei schließen
  692.         tst.w    d0
  693.         beq.w    .CloseErr        ..Fehler
  694.         exec
  695.         move.l    gl_BMHD(gl),a2
  696.         cmpi.b    #1,bmhd_Pack(a2)    PackTyp bekannt (ByteRun1)?
  697.         bgt.w    .PackErr        ..nein
  698.         move.w    bmhd_W(a2),d0
  699.         addi.w    #15,d0
  700.         lsr.w    #4,d0
  701.         add.w    d0,d0
  702.         moveq.l    #0,d1
  703.         move.b    bmhd_Depth(a2),d1
  704.         mulu.w    d1,d0
  705.         mulu.w    bmhd_H(a2),d0        d0.l = PictureSize
  706.         moveq.l    #ig_SIZEOF,d1        ..+Image-Structure-Size
  707.         tst.l    gl_aImage(gl)
  708.         beq.b    .ImageCont
  709.         add.b    d1,d1        ..nochmal, da es zwei Images sind
  710. .ImageCont    add.l    d1,d0
  711.         move.l    #MEMF_PUBLIC!MEMF_CLEAR,d1
  712.         move.l    d0,-(sp)
  713.         fjsr    AllocVec            Speicher besorgen
  714.         move.l    (sp)+,d1
  715.         move.l    d0,gl_Image1(gl)
  716.         beq.w    .MemErr2            ..Fehler
  717.         tst.l    gl_aImage(gl)
  718.         beq.b    .ImageCont2
  719.         lsr.l    #1,d1
  720.         add.l    d1,d0
  721.         move.l    d0,gl_Image2(gl)        ggf. 2. ImageAdresse
  722.         lsr.w    #1,bmhd_H(a2)        jedes Image hat eine vertikale
  723.                         ;Hälfte
  724. .ImageCont2
  725.         movea.l    gl_Image1(gl),a0
  726.         movea.l    gl_BODY(gl),a1
  727.         bsr.w    .CreateImage            1. Image berechnen
  728.         tst.l    gl_aImage(gl)
  729.         beq.b    .ImageCont3
  730.         movea.l    gl_Image2(gl),a0
  731.         movea.l    d0,a1
  732.         bsr.w    .CreateImage            ggf. 2. Image auch
  733. .ImageCont3
  734.         movea.l    a2,a1
  735.         clr.l    gl_BMHD(gl)
  736.         fjsr    FreeVec                BMHD freigeben
  737.         movea.l    gl_BODY(gl),a1
  738.         clr.l    gl_BODY(gl)
  739.         fjsr    FreeVec                BODY freigeben
  740.         moveq.l    #-1,d0
  741.  
  742. .Exit        lea.l    12(sp),sp
  743.         pull    d0-d6/a0-a2/lb
  744.         rts
  745.  
  746. ;-- alle Error-Routinen außer .MemErr2 benötigen lb = *DOSBase! --
  747.  
  748. .ILBMErr    bsr.w    _GetIOErr
  749.         bne.b    .ILBMCont            ..DOS-Fehler
  750. .ILBMErr2    move.l    #ERROR_OBJECT_WRONG_TYPE,gl_Result2(gl)
  751. .ILBMCont    lea.l    .ILBMTxt(pc),a2
  752.         ;||
  753. ;    In:    a2 = *ErrorText, the routine closes da file
  754.  
  755. .PrintError    move.l    d4,d1
  756.         fjsr    Close                Datei schließen
  757. .PrintError2    move.l    a2,d1
  758.         lea.l    gl_aFrom(gl),a0
  759.         move.l    a0,d2
  760.         fjsr    VPrintf                ..und Text ausgeben
  761. .ErrorExit    clr.b    d0                cc=eq
  762.         bra.b    .Exit
  763.  
  764. .MissErr    moveq.l    #ERROR_REQUIRED_ARG_MISSING,d0
  765.         move.l    d0,gl_Result2(gl)
  766.         lea.l    .MissTxt(pc),a2
  767.         bra.b    .PrintError
  768.  
  769. .CloseErr
  770. .OpenErr    bsr.w    _GetIOErr
  771.         lea.l    .InfoTxt(pc),a2
  772.         bra.b    .PrintError2
  773.  
  774. .ReadErr    bsr.w    _GetIOErr
  775.         lea.l    .ReadTxt(pc),a2
  776.         bra.b    .PrintError
  777.  
  778. .MemErr        moveq.l    #ERROR_NO_FREE_STORE,d0
  779.         move.l    d0,gl_Result2(gl)
  780.         lea.l    .InfoTxt(pc),a2
  781.         bra.b    .PrintError
  782.  
  783. .MemErr2    moveq.l    #ERROR_NO_FREE_STORE,d0
  784.         move.l    d0,gl_Result2(gl)
  785.         lea.l    .MemTxt(pc),a0
  786.         move.l    a0,d1
  787.         slib    DOS
  788.         fjsr    PutStr                Text ausgeben
  789.         bra.b    .ErrorExit
  790.  
  791. .PackErr    move.l    #ERROR_NOT_IMPLEMENTED,gl_Result2(gl)
  792.         lea.l    .PackTxt(pc),a2
  793.         bra.b    .PrintError2
  794.  
  795. ;-- Image-Struktur ausfüllen --
  796. ;    In:    a0 = *ImageStruct (hinten dran Speicher für die Graphik)
  797. ;        a1 = *CurrentBODYAddress, a2 = *BMHD-Address
  798. ;    Out:    d0 = *NewBODYAddress
  799. ;    ACHTUNG: wenn gl_aImage ~= 0: bmhd_H durch 2 teilen!
  800. ;         bmhd_Pack muß 0 oder 1 sein!
  801.  
  802. .CreateImage    push    d1-d7/a0-a3
  803.  
  804.         lea.l    ig_SIZEOF(a0),a3
  805.         move.l    a3,ig_ImageData(a0)
  806.         move.w    #$ff00,ig_PlanePick(a0)
  807.         move.b    bmhd_Depth(a2),ig_Depth+1(a0)
  808.         move.l    bmhd_W(a2),ig_Width(a0)
  809.  
  810.         move.w    bmhd_W(a2),d4
  811.         addi.w    #15,d4
  812.         lsr.w    #4,d4
  813.         add.w    d4,d4            d4.w = LineSize
  814.         move.w    bmhd_H(a2),d2        d2.w = LineNumba
  815.         move.w    ig_Depth(a0),d7
  816.         mulu.w    d2,d7
  817.         subq.w    #1,d7
  818.         mulu.w    d4,d7            d7.l = PlaneSize*Depth-LineSize
  819.         subq.w    #1,d2            d2.w = LineNumba-1
  820.         move.w    d2,d6
  821.         mulu.w    d4,d6            d6.l = PlaneSize-LineSize
  822.  
  823. .LineLoop    moveq.l    #0,d3
  824.         move.b    bmhd_Depth(a2),d3
  825.         subq.b    #1,d3
  826. .DepthLoop    move.w    d4,d5
  827. .InLineLoop    moveq.l    #0,d0
  828.         tst.b    bmhd_Pack(a2)        Bild gepackt?
  829.         beq.b    .UnPacked        ..nein
  830.         move.b    (a1)+,d0        ..ja, ein Byte lesen
  831.         blt.b    .Crunch            ..ByteRun: gecruncht
  832.  
  833. .NoCrunch    sub.w    d0,d5            übrige Bytes/Zeile korrigieren
  834. .NCLoop        move.b    (a1)+,(a3)+        ungecrunchte Bytes kopieren
  835.         dbf    d0,.NCLoop
  836.         bra.b    .Cont
  837.  
  838. .Crunch        neg.b    d0
  839.         sub.w    d0,d5            übrige Bytes/Zeile korrigieren
  840.         move.b    (a1)+,d1
  841. .CLoop        move.b    d1,(a3)+        gepackte Bytes kopieren
  842.         dbf    d0,.CLoop
  843. .Cont
  844.         subq.w    #1,d5            Control-Byte abziehen
  845.         bgt.b    .InLineLoop        ..Zeile noch nicht zu Ende
  846. .DepthEnd    add.l    d6,a3            nächste Bitplane
  847.         dbf    d3,.DepthLoop
  848.         sub.l    d7,a3            wieder zur 1. Bitplane, aber
  849.                         ;jetzt die nächste Zeile
  850.         dbf    d2,.LineLoop
  851.  
  852.         move.l    a1,d0            Returncode = *NeuerBODY
  853.         pull    d1-d7/a0-a3
  854.         rts
  855.  
  856. .UnPacked    subq.w    #1,d5
  857. .UPLoop        move.b    (a1)+,(a3)+        Graphik direkt kopieren
  858.         dbf    d5,.UPLoop
  859.         bra.b    .DepthEnd        nächste Line der nächsten Plane
  860.  
  861. ;IF BIT7 SET, CRUNCH=ON  -> NUMBER =-BYTE+1    <= ByteRun1-Algorithmus
  862. ;       ELSE, CRUNCH=OFF -> NUMBER = BYTE+1
  863.  
  864. .ILBMTxt    dc.b    "'%s': No IFF (FORM/ILBM) File!",$0a,0
  865. .InfoTxt    dc.b    "Couldn't get information on '%s'!",$0a,0
  866. .ReadTxt    dc.b    "'%s': Error while reading!",$0a,0
  867. .MissTxt    dc.b    "'%s': BMHD- or BODY-Chunk missing!",$0a,0
  868. .MemTxt        dc.b    "Can't create Icon-Images!",$0a,0
  869. .PackTxt    dc.b    "'%s': Unknown pack-method!",$0a,0
  870.